package cn.peng.stu4teach.util.base;

import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.ViewModel;

import cn.peng.stu4teach.R;


/**
 * 基类 Activity
 * 内部封装了 DataBinding 的绑定操作
 */
public abstract class BaseActivity<V extends ViewDataBinding, VM extends ViewModel> extends AppCompatActivity {
    protected V  mBinding;
    protected VM mVM;

    public Context getActivity () {
        return this;
    }

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        changeStatusBar();
        initDataBinding();

        initData();
        initViewObservable();
    }

    private void changeStatusBar () {
        // 修改状态栏字体颜色，用AndroidX官方兼容API
        WindowInsetsControllerCompat wic = WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
        // true表示Light Mode，状态栏字体呈黑色，反之呈白色
        wic.setAppearanceLightStatusBars(true);
        // 修改状态栏背景颜色，还是通用API，这个比较简单
        getWindow().setStatusBarColor(Color.WHITE);
    }

    /**
     * 修改状态栏V2——这个有副作用，先不要用！！！
     * 在基于 compileSdk 34、Android Studio Jellyfish | 2023.3.1 Patch 1、Theme.Material3.DayNight.NoActionBar 创建
     * 空 Activity 时，onCreate 中会有如下方法，测试发现，可以改变状态栏的颜色。
     */
    protected void changeStatusBar2() {
        EdgeToEdge.enable(this);

        // R.id.main 是页面布局中，根组件的ID
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }

    /**
     * 注入绑定
     */
    private void initDataBinding () {
        if ((setLayoutId()) > 0) {
            mBinding = DataBindingUtil.setContentView(this, setLayoutId());
        }

        // 为布局文件绑定 Vm
        VM vm = setBrVm();
        if (setBrVmId() > 0 && null != vm) {
            mBinding.setVariable(setBrVmId(), mVM = vm);
        }
    }

    /**
     * 设置当前页面使用的布局文件的ID
     * @return 布局layout的id
     */
    public abstract int setLayoutId ();
    /**
     * 在布局文件中声明的 vm 的ID。
     * 假设布局文件中有如下设置：
     * <p>
     * <data>
     * <variable
     * name="vm"
     * type="cn.peng.main.MainVm" />
     * </data>
     * <p>
     * 那么，DataBinding 会使用 name 的值为 name 生成一个 ID , 上面代码生成的 ID 为 BR.vm。
     * <p>
     * 我们这里需要的就是这个ID
     */
    public abstract int setBrVmId ();

    /**
     * 设置布局文件中使用的 vm 对象
     */
    public abstract VM setBrVm ();

    /**
     * 初始化数据
     */
    public void initData () {
        // 由子类实现
    }


    /**
     * 初始化视图观察者
     */
    public void initViewObservable () {
        // 由子类实现
    }
}
